using System.Text.RegularExpressions;

namespace CSharpePro._1028;
public class UserService:IUserService
{
    // 使用泛型集合保存注册用户信息
    private readonly List<User> users = new List<User>();

    public void Show()
    {
        while (true)
        {
            Console.WriteLine();
            Console.WriteLine("请输入数字以选择功能");
            Console.WriteLine("1. 登录");
            Console.WriteLine("2. 注册");
            Console.WriteLine("3. 退出");
            Console.Write("选择: ");
            var input = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(input))
            {
                Console.WriteLine("不可为空, 请输入有效数字!!!");
                continue;
            }

            if (!int.TryParse(input.Trim(), out int num))
            {
                Console.WriteLine("请输入有效数字");
                continue;
            }

            switch (num)
            {
                case 1:
                    Login();
                    break;
                case 2:
                    Register();
                    break;
                case 3:
                    Logout();
                    return;
                default:
                    Console.WriteLine("请输入1-3之间的数字");
                    break;
            }
        }
    }

    public void Login()
    {
        Console.WriteLine("==== 登录界面 ====");
        Console.Write("请输入用户名：");
        var username = Console.ReadLine()?.Trim();
        if (string.IsNullOrEmpty(username))
        {
            Console.WriteLine("用户名不能为空");
            return;
        }

        // 使用 foreach 迭代查找用户
        User found = null;
        foreach (var u in users)
        {
            if (u.Username.Equals(username, StringComparison.Ordinal))
            {
                found = u;
                break;
            }
        }

        if (found == null)
        {
            Console.WriteLine("用户名不存在");
            return;
        }

        Console.Write("请输入密码：");
        var password = Console.ReadLine();
        if (password == null || !found.Password.Equals(password))
        {
            Console.WriteLine("密码错误");
            return;
        }
        Console.WriteLine($"登陆成功！欢迎，{found.Username}！");
    }

    public void Register()
    {
        Console.WriteLine("==== 用户注册 ====");
        string username;
        while (true)
        {
            Console.Write("请输入用户名：");
            username = Console.ReadLine()?.Trim();
            var (isValid, message) = ValidateUsername(username);
            if (!isValid)
            {
                Console.WriteLine(message);
                continue;
            }

            // 使用 foreach 检查用户名是否已存在
            bool exists = false;
            foreach (var u in users)
            {
                if (u.Username.Equals(username, StringComparison.Ordinal))
                {
                    exists = true;
                    break;
                }
            }

            if (exists)
            {
                Console.WriteLine("用户名已存在，请选择其他用户名");
                continue;
            }

            break;
        }

        string password;
        while (true)
        {
            Console.Write("请输入密码：");
            password = Console.ReadLine();
            Console.Write("请确认密码：");
            var confirmPassword = Console.ReadLine();

            var (isValid, message) = ValidatePassword(password, confirmPassword);
            if (!isValid)
            {
                Console.WriteLine(message);
                continue;
            }

            break;
        }

        // 注册并保存到泛型集合
        users.Add(new User(username, password));
        Console.WriteLine("注册成功!");
    }

    public void Logout()
    {
        Console.WriteLine("感谢使用，再见！");
    }

    // 将用户名/密码校验逻辑放在服务实现中（User 只保留数据结构）
    private (bool, string) ValidateUsername(string username)
    {
        if (string.IsNullOrEmpty(username))
        {
            return (false, "用户名不能为空");
        }

        if (username.Length < 3 || username.Length > 15)
        {
            return (false, "用户名长度必须为3-15个字符！");
        }

        // 允许字母、数字、下划线
        if (!Regex.IsMatch(username, @"^[a-zA-Z0-9_]+$"))
        {
            return (false, "用户名只能包含字母、数字和下划线");
        }

        return (true, "用户名合法");
    }

    private (bool, string) ValidatePassword(string password, string confirmPassword)
    {
        if (string.IsNullOrWhiteSpace(password))
        {
            return (false, "密码不能为空");
        }

        if (password.Length < 6 || password.Length > 20)
        {
            return (false, "密码长度必须为6-20个字符");
        }

        if (!Regex.IsMatch(password, @"[A-Z]") || !Regex.IsMatch(password, @"[a-z]") || !Regex.IsMatch(password, @"[0-9]"))
        {
            return (false, "密码必须包含至少1个大写字母、1个小写字母和1个数字");
        }

        if (password != confirmPassword)
        {
            return (false, "两次密码不一致！");
        }

        return (true, "密码合法");
    }
}